#include "../include/Image.h"
#include <iostream>
#include <fstream>

Image::Image()
{
    Image(0,0);
}

Image::~Image()
{
    delete[] grid;
}

/**
* Constructeur d'une image de rendu d'un taille choisit
* @param width largeur de l'image en pixels
* @param height hauteur de l'image en pixels
* @return une image de rendu
*/
Image::Image(int width, int height)
{
    grid = new Color[width*height];
    this->width = width;
    this->height = height;
}

/**
* Modification de la couleur d'un pixel de l'image
* @param x coordonnées d'abscisse du pixel sur la grille
* @param y coordonnées d'ordonnée du pixel sur la grille
* @param c couleur que l'on veut donner au pixel
*/
void Image::setPixel(int x, int y, Color c)
{
    if(x>=this->width || y>=this->height || x < 0 || y < 0) throw "bad index";
    //control pour empecher la saturation des couleurs
    if(c.x>1){
        c.y = c.y/c.x;
        c.z = c.z/c.x;
        c.x = 1;
    }
    if(c.y>1) {
        c.x = c.x/c.y;
        c.z = c.z/c.y;
        c.y = 1;
    }
    if(c.z>1){
        c.y = c.y/c.z;
        c.x = c.x/c.z;
        c.z = 1;
    }
    //modification des couleurs
    grid[width * y + x] = c;
}

/**
* Getteur de la couleur d'un pixel
* @param x coordonnées d'abscisse du pixel sur la grille
* @param y coordonnées d'ordonnée du pixel sur la grille
* @return la couleur du pixel
*/
Color Image::getPixel(int x, int y)
{
    if(x>=width || y>=height || x < 0 || y < 0) throw "bad index";
    return grid[width * y + x];
}

/**
* Methode permettant d'exporter l'image dans un fichier
* @param fileName nom du fichier recevant l'image de rendu
*/
void Image::exportToFile(char * fileName)
{
    std::ofstream file;
    file.open(fileName);
    file<<"P3"<<std::endl;
    file<<width<<" "<<height<<std::endl;
    file<<"255"<<std::endl;
    int pcount = width * height;
    for(int i = 0; i<pcount; i++){
        file<<(int)(grid[i].x*255.0)<<" "<<(int)(grid[i].y*255.0)<<" "<<(int)(grid[i].z*255.0)<<" ";
    }
    file.close();
}
